变基也是将一个分支的代码整合到另外一个分支。跟merge功能类似,但也存在着很大的不同。变基可以把提交线整合得更加是一条直线。主要是通过消除合并(merge)记录来实现的。
1. 合并(Merge)——简单粗暴的“打包整理”
场景:
假设你和同事一起写文档,各自在文档的不同部分修改(各自有一个分支)。
操作:
你把同事的修改(分支)直接“打包”合并到你的主版本里。
合并后会新增一个“合并提交”,记录这次合并动作(类似贴个标签:“此处合并了同事的修改”)。
结果:
历史记录中能看到两个分支的完整轨迹,但可能会像这样:
主分支:A → B → C → M(合并提交)
同事分支: D → E
优点:简单安全,保留完整历史。
缺点:如果分支多,历史记录会像一团毛线,难以追踪。
2. 变基(Rebase)——强迫症的“重新整理”
场景:
还是你和同事写文档,但你想让修改历史看起来像一条直线,没有分叉。
操作:
你把同事的修改(分支)“剪切”下来,然后**“粘贴”到你的最新版本后面**。
相当于假装同事的修改是基于你最新代码写的(实际修改内容不变,但历史被重写)。
结果:
历史记录变成一条直线:
主分支:A → B → C → D' → E'
(D和E被“重放”到C后面,变成D’和E’)
优点:历史干净,方便查看代码演进。
缺点:重写历史有风险(如果已推送远程分支,可能坑队友)。
直接对比
|
合并(Merge) |
变基(Rebase) |
| 历史记录 |
保留分叉,能看到合并点 |
变成直线,隐藏分叉 |
| 适用场景 |
公共分支(如主分支) |
个人开发分支(未共享的分支) |
| 风险 |
安全,不修改历史 |
重写历史,可能引发冲突或混乱 |
| 操作结果 |
多一个合并提交(Merge Commit) |
无额外提交,直接拼接提交 |
生活类比
合并:搬家时,直接把两个箱子堆在一起,贴个标签“合并箱子1和箱子2”。
变基:搬家时,把两个箱子的东西重新整理成一个箱子,假装一开始就只有一个箱子。
黄金原则
合并:用于公共分支(比如团队协作的主分支),保证历史完整。
变基:用于自己的本地分支,整理干净后再合并到主分支。
千万不要:对已推送到远程的分支做变基(除非你知道自己在做什么)!
什么时候使用变基
1.看公司的策略。有的公司认为提交历史就是实际发生过的事件的记录。它是一个记载着历史的“史书”,自有其价值,而且不能随意篡改。从这个角度来说,是不允许更改提交历史,也就不能使用变基了。
2.还有另外一个角度是,提交历史是关于项目如何被构建的故事。就像我们写的软件,一定是整理好了才发出去,使得后来的人能够更好的理解项目的构建。这时候就推荐使用变基。
常用命令:
git rebase --continue 继续变基
git rebase --abort 终止变基
使用场景:
1,本地将多个提交合并为一个提交
启动交互式变基:
使用命令,指定要变基的基点(通常是当前分支的上游分支)。
git rebase -i HEAD~n,这里的 n 是你想要合并的提交数量。
会打开一个文本编辑器,显示最近的 n 个提交。你会看到每个提交前面有一个 pick 字段。
将你想要合并为一个提交的第一个提交保留为 pick,而将其他提交的 pick 更改为 squash(或简写为 s)。
squash <提交> = 使用提交,但融合到前一个提交
最后还可以重新编写提交说明
保存并关闭编辑器,Git 会开始变基过程,并将选定的提交合并为一个提交。
# goland 快捷操作
右击从这里进行交互式变基->选中文件->点压缩->点击启动编辑
2,多人使用同一个分支开发(未验证)
git push产生冲突,说明有人先你一步同步了他的本地代码到远程。
这时候,你需要先拉取代码,可以使用命令
git pull , 该命令会将远程的提交和你本地的提交merge,如果有冲突需要手动解决并提交,会产生merge的记录
git pull -- rebase 该命令会把你的提交“放置”在远程拉取的提交之后,即改变基础(变基),如果有冲突
解决所有冲突的文件,git add <冲突文件>
git rebase --continue
完美解决问题。
3,自己单独分支合并到主分支(要求本地的提交记录,都在master最新提交的后面)
要将本地分支 a 合并到 master 分支,并确保本地的提交记录都在 master 最新提交的后面,可以使用 git rebase。以下是具体的步骤:
-
切换到 master 分支:
-
确保 master 是最新的:
从远程拉取最新的 master:
-
切换到本地分支 a:
-
对本地分支 a 进行变基:
将 a 的提交放置在 master 的最新提交之后:
- 如果在这个过程中出现冲突,解决冲突后使用 git add <冲突文件>,然后继续变基:
-
切换回 master 分支:
-
合并 a 到 master:
使用快进合并(因为 a 已经在 master 之上):
-
推送到远程 master:
最后,将合并后的 master 推送到远程:
总结
通过以上步骤,你可以确保本地分支 a 的提交记录都在 master 最新提交的后面,并且合并后的结果会保持提交历史的整洁。
注意事项:
在使用 git rebase 时,冲突的处理顺序是非常重要的。以下是关于冲突处理的详细说明:
1. Rebase 的过程
- 当你执行
git rebase <base> 时,Git 会逐个应用你在当前分支上的提交到 <base> 分支上。
- 如果在应用某个提交时遇到冲突,Git 会暂停 rebase,并提示你解决冲突。
2. 解决冲突的正确步骤
- 先进行 rebase:当你执行
git rebase 后,如果遇到冲突,Git 会停止并让你解决冲突。
- 解决冲突:在冲突发生时,你需要手动解决冲突,然后使用
git add <冲突文件> 来标记冲突已解决。
- 继续 rebase:解决完所有冲突后,使用
git rebase --continue 来继续应用后续的提交。
3. 如果先解决冲突再 rebase
如果你在执行 git rebase 之前手动解决了冲突,然后再执行 git rebase,那么这些冲突仍然可能会出现,因为 rebase 过程会尝试将你的提交一一应用到新的基础上。这意味着:
- 如果你在执行 rebase 之前已经解决了某些冲突,rebase 过程可能会再次遇到相同的冲突,尤其是如果你的基础分支(如
master)在你开始 rebase 之后发生了变更。
结论
- 正确的做法是:执行
git rebase 后,遇到冲突时解决冲突,然后继续 rebase。
- 不要在 rebase 之前手动解决冲突,因为这可能导致你在 rebase 过程中再次遇到相同的冲突。
这样可以确保你在 rebase 过程中处理冲突的方式是正确的,并且避免不必要的混乱。
————————————————
#git删除历史提交中的一个文件
如果多余的文件是在第一次提交中添加的,并且你希望从历史中彻底删除该文件,可以使用 git rebase 交互式模式来修改历史提交。
步骤 1:启动交互式 rebase
假设你有三次提交,可以使用以下命令:
git rebase -i HEAD~3
这会打开一个编辑器,显示最近三次提交的记录,例如:
pick commit1 第一次提交
pick commit2 第二次提交
pick commit3 第三次提交
步骤 2:修改提交
找到包含多余文件的提交(假设是第一次提交),将其行的 pick 改为 edit:
edit commit1 第一次提交
pick commit2 第二次提交
pick commit3 第三次提交
步骤 3:删除文件并修改提交
Git 会停在第一次提交的位置。此时可以删除多余的文件:
git rm <file-path>
将更改追加到当前提交:
git commit --amend
继续 rebase 过程:
git rebase --continue
步骤 4:完成
多余的文件已从第一次提交中移除,后续提交会基于修改后的历史重新应用。
#多个提交变为一个提交
启动交互式变基:
假设你想要压缩最近的 3 个提交,可以使用以下命令:
git rebase -i HEAD~3
这将打开一个文本编辑器,显示最近 3 个提交的列表。
编辑提交列表:
在打开的编辑器中,你会看到类似于以下的内容:
pick abcdef1 Commit message 1
pick abcdef2 Commit message 2
pick abcdef3 Commit message 3
将第二个和第三个提交的 pick 改为 squash(或简写为 s):
pick abcdef1 Commit message 1
squash abcdef2 Commit message 2
squash abcdef3 Commit message 3
保存并关闭编辑器:
保存文件并关闭编辑器。Git 将会开始变基过程,并尝试将这些提交合并成一个。
编辑合并后的提交信息:
接下来,Git 会打开另一个编辑器窗口,让你编辑合并后的提交信息。你可以选择保留所有提交的信息,或只保留你想要的内容。编辑完成后,保存并关闭编辑器。
完成变基:
如果没有冲突,变基将会成功完成,多个提交将被合并为一个。
来源:
原文链接:https://blog.csdn.net/2301_80118057/article/details/145914766
https://blog.csdn.net/weixin_44154094/article/details/114337077
「三年博客,如果觉得我的文章对您有用,请帮助本站成长」
共有 0 - git rebase 变基